ヘッダーをスキップ
Oracle TimesTen Cache Connect to Oracle開発者および管理者ガイド
リリース6.0
B25773-02
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

キャッシュ・グループ表の定義

最も基本的なタイプのキャッシュ・グループは、TimesTenで単一のOracle表をキャッシュするキャッシュ・グループです。複数の表を単一のキャッシュ・グループにキャッシュする処理は複雑であるため、Cache Connect to Oracleの概念の詳細を理解している必要があります。

通常、キャッシュされる各Oracle表には、1つ以上の主キーまたはNULLでない一意索引キーが必要です。また、TimesTenキャッシュ・グループ表で定義されている主キーおよび一意索引は、Oracle表の主キーおよび一意索引と一致している必要があります。たとえば、Oracle表に主キーまたは一意索引列C1C2およびC3がある場合、キャッシュされた表の対応するTimesTenの主キーにも列C1C2およびC3が必要です。Oracleの1次索引および一意索引とキャッシュ・グループ表の1次索引および一意索引が一致しない場合は、キャッシュ・グループが制限され、AUTOREFRESH機能またはPROPAGATE機能を使用できません。詳細は、「制限付きキャッシュ・グループについて」を参照してください。

非一意索引は、TimesTenキャッシュ表に対して無制限に作成できます。索引をキャッシュ表に追加すると、非キャッシュTimesTen表と同様の方法でSQLを高速化できます。不適切な一意制約による障害が発生することがあるため、Oracle表の一意索引と一致しない一意索引は作成しないでください。

注意: USERMANAGEDキャッシュ・グループは、Oracleのマテリアライズド・ビューが含まれるように定義できますが制限されます(「制限付きキャッシュ・グループについて」を参照)。かわりに、任意のタイプのキャッシュ・グループを作成して、マテリアライズド・ビュー用のOracleディテール表を含めることができます。
注意: 一時表をキャッシュ・グループに含めることはできません。

この項の内容は次のとおりです。

単一のキャッシュ・グループ表の定義

次のように、単純なキャッシュ・グループ定義を作成して、単一表をキャッシュします。

CREATE TYPE CACHE GROUP Owner.Name
FROM
  Owner.RootTable(
     ColList,
     PRIMARY KEY(PrimaryKeyColList));

ここで、

注意: Cache Connect to Oracleの機能を最大限に使用するには、TimesTenおよびOracleの両方の表で一致する主キーまたは一意キーを持っている必要があります。そうでない場合は、キャッシュ・グループが制限されます(「制限付きキャッシュ・グループについて」を参照)。
例2.1

図2.11に、CUSTOMER Oracle表をキャッシュするためのTargetCustomersという単一表のREADONLYキャッシュ・グループを示します。TimesTenキャッシュ・グループのデータは、Oracleデータベースに保存されているすべての顧客に関する大量のデータ・セットのサブセットです。

図2.11
TimesTenでの単一Oracle表のキャッシュ

単一表のTargetCustomersキャッシュ・グループの作成に使用されるCREATE READONLY CACHE GROUP文は、次のとおりです。

CREATE READONLY CACHE GROUP TargetCustomers
FROM
  user1.customer (
    cust_num   INTEGER NOT NULL PRIMARY KEY,
    region     CHAR(5) NOT NULL,
    name       CHAR(80),
    address    CHAR(255) NOT NULL
  );

複数のキャッシュ・グループ表の定義

複数のOracle表が同じキャッシュ・グループにキャッシュされる場合は、1つのルート表および1つ以上の子表を定義する必要があります。1つのキャッシュ・グループに存在できるルート表は、1つのみです。

複数の表を持つキャッシュ・グループでは、キャッシュ・グループ内の各子表は、外部キー制約を使用してキャッシュ・グループ内のルート表または別の子表と結合する必要があります。TimesTenでは外部キー制約を使用してキャッシュ・グループ内の表を結合する必要がありますが、Oracleインスタンスでは結合する必要はありません。キャッシュ・グループ内のルート表は、外部キー制約を介してキャッシュ・グループ内の他のすべての表を参照しません。キャッシュ・グループ内の他のすべての表は子表です。

各表定義には、キャッシュされた表の1つ以上の列に対して主キーが含まれている必要があります。また、各子表には、親表の主キーに対する外部キー参照が含まれている必要があります。キャッシュ・グループの表の階層では、他の子表の親になるように子表を指定できますが、キャッシュ・グループ内の表は、キャッシュ・グループ内の複数の親の子になることはできません。適切なキャッシュ・グループ表の構成の例は、例2.2を参照してください。図2.13に不適切な表設定を示し、図2.14に問題の回避策を示します。

各Oracle表がキャッシュに含まれるように、キャッシュ・グループ内で個別の表定義を作成する必要があります。キャッシュ・グループ内の表定義の所有者および名前は、Oracle表の所有者および名前と一致している必要があります。表定義を作成すると、Oracle表の列のすべてまたはサブセットをキャッシュできます。

注意: 各Oracle表は1つのキャッシュ・グループにのみ定義できます。同じOracle表をキャッシュするキャッシュ・グループを複数作成することはできません。

次のように、単純なキャッシュ・グループ定義を作成して、1つのRootTableおよび1つのChildTableをキャッシュします。

CREATE TYPE CACHE GROUP Owner.Name
FROM
  Owner.RootTable(
     ColList,
     PRIMARY KEY(PrimaryKeyColList)),
  Owner.ChildTable(
     ColList,
     PRIMARY KEY(PrimaryKeyColList),
     FOREIGN KEY(ReferenceColList)
        REFERENCES Owner.RootTable(PrimaryKeyColList));

ここで、

例2.2

図2.12に、前述の図2.11で示したTargetCustomersキャッシュ・グループの複数表バージョンを示します。この例では、キャッシュ・グループは3つのOracle表CustomerOrdersおよびOrder_Itemをキャッシュするように拡張されています。キャッシュ・グループのデータは、Oracleデータベースに保存されているすべての顧客に関する大量のデータ・セットのサブセットです。TargetCustomersキャッシュ・グループ内の各親表は、主キー(太字で示されています)を持ち、外部キー関係を介して子表によって参照されます(矢印で示されています)。Customer表は、キャッシュ・グループ内の別の表を参照しないため、ルート表になります。Customer表の主キーは、TargetCustomersキャッシュ・グループの主キーです。OrdersおよびOrder_Item表は子表です。

OracleからTimesTen USERMANAGEDキャッシュ・グループにロードされる基本単位は、キャッシュ・インスタンスで、外部キー関係を介してキャッシュ・グループのルート表の特定の行に関連付けられている行のセットを記述します(『Oracle TimesTen In-Memory Databaseアーキテクチャ概要』のCache Connect to Oracleに関する章のキャッシュ・インスタンスの項を参照)。ルート表の主キー122によって識別されるキャッシュ・インスタンスは、キャッシュ・グループの各表内で強調表示されています。このキャッシュ・インスタンス・キーによって、ルート表の行およびこの行を参照する子表のすべての関連行が識別されます。

図2.12 複数の表を持つキャッシュ・グループ

複数表のTargetCustomersキャッシュ・グループの作成に使用されるCREATE READONLY CACHE GROUP文は、次のとおりです。

CREATE READONLY CACHE GROUP TargetCustomers
FROM
user1.customer (
  cust_num  integer not null primary key,
  region    char(5) not null,
  name      varchar(80),
  address   varchar(255) not null
),
user1.orders (
  ord_num       integer not null primary key,
  cust_num      integer not null,
  when_placed   timestamp not null,
  when_shipped  timestamp,
  notes         varchar(1024),
  foreign key (cust_num) references user1.customer (cust_num)
),
user1.order_item (
  ord_num   integer not null,
  prod_num  integer not null,
  quantity  integer not null,
  primary key (ord_num, prod_num),
  foreign key (ord_num) references user1.orders (ord_num)
);
例2.3

図2.13に、キャッシュ・グループの不適切な表の構成の例を示します。CustomerOrdersおよびOrder_Item表と同じキャッシュ・グループのデモ・スキーマからProductsおよびInventory表を定義することはできません。Products表にはルート表Customersへの(直接または間接の)外部キー参照がないためです。つまり、Products表もルート表とみなされ、1つのキャッシュ・グループは1つ以上のルート表を持つことができないため無効となります。

図2.14に示すように、TimesTenデモ・スキーマのすべての表をキャッシュするために、ProductsおよびInventory表に対して2つ目のキャッシュ・グループを作成できます。

図2.13 問題: 2つのルート表
図2.14 解決策: 2つの個別のキャッシュ・グループ

Oracleパーティション表のキャッシュ

通常のOracle表をキャッシュする場合と同じ表記規則に従って、キャッシュ・グループ内のOracleパーティション表を定義できます。たとえば、READONLYキャッシュ・グループ内のパーティション表には、対応するNULLでない一意の索引がOracle内に必要です。キャッシュ・グループで使用されるパーティション表は、任意の方法(ハッシュ、リスト、範囲または複合)でパーティション化またはサブパーティション化できます。

個々のパーティションは、制限付きキャッシュ・グループ内に間接的にキャッシュできます。たとえば、キャッシュ・グループを作成して、表のパーティションのマテリアライズド・ビューをキャッシュできます。最初に、個々のパーティションを参照するマテリアライズド・ビューをOracleで作成し、次に、マテリアライズド・ビューをキャッシュします(例2.4を参照)。

例2.4

Oracleでは、表partitioned_tableのパーティションF200402に保存されたデータのマテリアライズド・ビューmv_ptを次のように定義します。

CREATE MATERIALIZED VIEW user1.mv_pt
AS SELECT * FROM user1.partitioned_table PARTITION(F200402);

次に、制限付きユーザー管理キャッシュ・グループを作成して、マテリアライズド・ビューmv_ptをキャッシュします。

CREATE CACHE GROUP cg
FROM user1.mv_pt( ii INT NOT NULL PRIMARY KEY, jj INT);

Oracleパーティション表をキャッシュする場合は、次の制限が適用されます。

    CREATE READONLY CACHE GROUP badcachegroup
    FROM
     user1.partitioned_table(ii INT NOT NULL PRIMARY KEY, jj INT)
    WHERE ii IN (SELECT ii
                 FROM user1.partitioned_table
                 PARTITION(F200402));
注意: オフラインのパーティションでキャッシュ処理(LOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUPなど)を実行しようとすると、ORA-00376エラーまたはORA-01110エラーが発生します。ただし、パーティションがオフラインになった場合(バックアップ処理中など)は、このパーティションにアクセスしようとしないかぎり、エラーは生成されません。

Oracleのシノニムについて

キャッシュ・グループの表定義は、Oracle実表のOracleプライベート・シノニムを参照できます。実際のOracle実表は別のOracleスキーマ内に存在し、異なる名前を持つことができますが、シノニムと同じOracleサーバーに存在している必要があります。キャッシュ・グループの表名は、プライベート・シノニムの名前である必要がありますが、このシノニムは別のシノニムを示すことができます。この別のシノニムには、パブリックまたはプライベートのいずれのシノニムでも使用できます。シノニムは、最終的に、表、パーティション表またはマテリアライズド・ビューを(直接的または間接的に)示す必要があります。

Oracleシノニムに対する表定義が含まれているキャッシュ・グループは、USERMANAGED、SWTまたはAWTキャッシュ・グループです。USERMANAGEDキャッシュ・グループは、エージングに対してDURATION属性を指定して構成し、LOAD CACHE GROUP、UNLOAD CACHE GROUP、REFRESH CACHE GROUPおよびFLUSH CACHE GROUP処理をサポートすることができますが、AUTOREFRESHまたはREADONLY属性を指定して構成することはできません。READONLYキャッシュ・グループ内のOracleシノニムに対して表定義を持つことはできません。

制限付きキャッシュ・グループについて

次の場合、キャッシュ・グループは制限付きと呼ばれます。

キャッシュ・グループが制限されている場合は、Oracleからキャッシュ・グループにデータをロードする場合に重複キー・エラーが無視されます。制限付きキャッシュ・グループのロード時に重複キー・エラーをレポートする必要がある場合は、CREATE INDEXを使用して、Oracle表の主キーに対応するキャッシュ・グループ表の列に対して一意索引を作成できます。制限付きキャッシュ・グループのロード中に主キー違反がある場合は、キャッシュにロードされた行がすべての重複行の中からランダムに選択されます。

制限付きキャッシュ・グループは、1つのOracle表のみの内容をキャッシュできます。LOAD CACHE GROUP、UNLOAD CACHE GROUPおよびREFRESH CACHE GROUPの処理は、WHERE句が含まれていない場合、制限付きキャッシュ・グループで実行できます。FLUSH CACHE GROUP処理は、制限付きキャッシュ・グループでは実行できません。主キーまたは一意索引を持たないOracle表に対して制限付きキャッシュ・グループを作成することはできますが、キャッシュ・グループの内容をOracleに自動リフレッシュまたは伝播することはできません。

注意: Oracleの主キーまたは一意索引がTimesTenの主キーと同じ列のセットを持つかぎり、Oracleの主キーまたは一意索引の列はTimesTenの主キーの列と一致します。列順序は重要ではありません。

OracleとTimesTenのデータ型のマッピング

Oracle表に対応する表をキャッシュ・グループに作成する場合は、Oracle表の列ごとにTimesTenデータ型を選択する必要があります。使用可能なOracle/TimesTenデータ型のマッピングおよびデータ型変換ルールの詳細は、「キャッシュ・グループの作成のためにサポートされているOracleデータ型」を参照してください。

例2.5

次のOracle表の例では、TimesTenキャッシュ・グループで別々にマップする必要がある多数のデータ型が含まれています。

USER1.T1(C1 NUMBER(10,0) NOT NULL,
   C2 CHAR(20) NOT NULL,
   C3 LONG,
   PRIMARY KEY(C1, C2));
USER1.T2(C4 CHAR(20) NOT NULL,
   C5 NUMBER(10,0) NOT NULL,
   C6 TIMESTAMP(6) NOT NULL PRIMARY KEY,
   FOREIGN KEY(C5, C4) REFERENCES T1(C1, C2));
USER1.T3(C7 RAW(21) NOT NULL,
   C8 VARCHAR2(15) NOT NULL,
   C9 TIMESTAMP(6),
   C10 NUMBER(25,3),
   C11 LONG RAW,
   PRIMARY KEY (C8, C7),
   FOREIGN KEY (C9) REFERENCES T2(C6));

これらのOracle表をキャッシュするには、次の表定義を使用してTimesTenにキャッシュ・グループを作成します。

CREATE CACHE GROUP CG1
FROM
USER1.T1(C1 INT NOT NULL,
   C2 CHAR(20) NOT NULL,
   C3 VARCHAR(5000),
   PRIMARY KEY(C1,C2)),
USER1.T2(C4  CHAR(20),
   C5 INT,
   C6 TIMESTAMP NOT NULL,
   PRIMARY KEY (C6),
   FOREIGN KEY (C5, C4) REFERENCES T1(C1, C2)),
USER1.T3(C7  VARBINARY(21)NOT NULL,
   C8 VARCHAR(15) NOT NULL,
   C9 TIMESTAMP,
   C10 DECIMAL(25,3),
   C11 VARBINARY(3000000),
   PRIMARY KEY (C8, C7),
   FOREIGN KEY (C9) REFERENCES T2(C6));

例2.5では、USER1.T1はルート表、USER1.T2はUSER1.T1の子表、USER1.T3はUSER1.T2の子表です。

OracleのNUMBER(x,0)型は、xで指定される最大データ長に最も近いTimesTenのINTEGER型にマップできます。列T1.C1およびT2.C5で示されているように、TimesTenのINTEGERは、OracleのNUMBER(10,0)に最も近い型です。ただし、値が-32,768から32,767の範囲にあることがわかっている場合は、Oracle NUMBER(10,0)をTimesTen SMALLINTにマップできます。Oracle NUMBERはTimesTen VARCHARにマップできます。例の列T3.C10で示されているように、Oracle NUMBER(p,s)型は、TimesTen DECIMAL(p,s)またはNUMERIC(p,s)にマップできます。ここで、精度(p)およびスケール(s)は同じです。

Oracle LONG型は、TimesTen VARCHAR(x)にマップできます。ここで、xは列の最大データ長です。T1.C3の最大長は5000バイトです。

Oracle RAWまたはLONG RAW型は、TimesTen VARBINARY(x)にマップできます。ここで、xは列の最大データ長です。T3.C7の最大長は21バイト、T3.C11の最大長は3,000,000バイトです。

Oracle TIMESTAMP(6)は、列T2.C6およびT3.C9のように、TimesTen TIMESTAMPにマップできます。

Oracle VARCHAR2(x)は、TimesTen VARCHAR(x)にマップできます。ここで、xは列の最大データ長です。この最大値は両方の型で同じですが、2000を超えないようにする必要があります。列T3.C8の最大長は15バイトです。これらの型をこの方法でマップすると、VARCHAR比較ルールがOracleで異なることを示す警告が生成されます。文字列比較では、文字列の後続空白が重要であるためです。文字列比較で、列を主キーとして使用すると、OracleとTimesTen間で非互換性が生じる可能性があります。たとえば、Oracleでは、値「abc」と「abc   」は一意で、異なる主キーとみなされます。一方、TimesTenでは、これらの値は同一とみなされ、重複キー・エラーが生成されます。TimesTenでは、後続空白は保存され、Oracleへの値の伝播時に失われないため、この非互換性は比較処理に対してのみ適用されます。

例2.5に示すキャッシュ・グループを作成すると、列T2.C4とT2.C5がOracleで異なるNULL値可能設定を持つことを示す警告メッセージが生成されます。OracleとTimesTen間では、NULL値可能設定に一貫性を持たせることをお薦めしますが、主キーとして使用されていない列では、このような違いは許容されます。